﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DataTier.Repository;
using System.ServiceModel;
using DataTier.Entities;
using DataTier;
using Common;

namespace Otgruzka.ServicesClients
{
    public class OrdersClient
    {

        public readonly OrdersRepository Repository = null;

        public OrdersClient()
        {
            this.Repository = new OrdersRepository();
        }


        /// <summary>
        /// Возвращает полный текст Exceptions вместе с вложенными Exceptions
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        public string GetExceptionDetail(System.ServiceModel.FaultException<ExceptionDetail> ex)
        {
            string message = ex.Message;

            var ie = ex.InnerException;
            while (ie != null)
            {
                message += string.Format("<br />{0}", ie.Message);
                ie = ie.InnerException;
            }

            var ed = ex.Detail;
            do
            {
                message += string.Format("<br />{0}", ed.Message);
                ed = ed.InnerException;
            } while (ed != null);
            return message;
        }


        /// <summary>
        /// Возвращает список Заказов, в которых существуют неотгруженные товары
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<OrderEntity> GetNotShippedGoodsOrderList(int currentUserId)
        {
            try
            {
                var orders = Repository.GetNotShippedGoodsOrderList(currentUserId);
                return orders;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Заказов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список неотгруженных товаров с их количеством
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="param"></param>
        /// <param name="sortExpression"></param>
        /// <param name="direction"></param>
        /// <returns></returns>
        public List<OrderSpec> GetNotShippedGoodsList(int currentUserId, SearchParameters param = null, string sortExpression = null, string direction = null)
        {
            try
            {
                var products = Repository.GetNotShippedGoodsList(currentUserId, param, sortExpression, direction);
                return products;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список неотгруженных товаров из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает объект Заказ
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public OrderEntity GetOrder(int currentUserId, int id)
        {
            try
            {
                var order = Repository.GetOrder(currentUserId, id);
                return order;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить Заказ из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Заказов
        /// </summary>
        /// <returns></returns>
        public List<OrderFullInfoEntity> GetOrderList(int currentUserId, bool onlyIts, int numPage, int onPage, SearchParameters parameters = null, string sortExpression = null, string direction = null)
        {
            try
            {
                var orders = Repository.GetOrderList(currentUserId, onlyIts, numPage, onPage, parameters, sortExpression, direction);
                return orders;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Заказов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает общее количество Заказов
        /// </summary>
        /// <returns></returns>
        public int? GetOrderListCount(int currentUserId, bool onlyIts, SearchParameters parameters = null)
        {
            try
            {
                int ListCount = Repository.GetOrderListCount(currentUserId, onlyIts, parameters);
                return ListCount;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                return null;
            }
        }


        /// <summary>
        /// Сохраняет Заказ в базе данных
        /// </summary>
        /// <returns></returns>
        public int SaveOrder(int currentUserId, OrderEntity newOrder)
        {
            try
            {
                return Repository.SaveOrder(currentUserId, newOrder);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить Заказ в базу данных.");
            }
        }


        /// <summary>
        /// Удаление Закака из базы данных
        /// </summary>
        /// <param name="orderId"></param>
        public void DeleteOrder(int currentUserId, int orderId)
        {
            try
            {
                Repository.DeleteOrder(currentUserId, orderId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить Заказ из базы данных.");
            }
        }


    }
}